home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 26 / AMIGAplus Sonderheft 26 (2000)(Falke)(DE)(Track 1 of 2)[!].iso / Tools / GFX-Viewer / Animviewer / mpegvideo_datatype / mpegordered.c < prev    next >
C/C++ Source or Header  |  1999-03-29  |  8KB  |  260 lines

  1.  
  2. /*
  3. **
  4. **  $VER: mpegordered.c 1.8 (3.5.97)
  5. **  mpegvideo.datatype 1.8
  6. **
  7. **  This file contains C code to implement an
  8. **  ordered dither.
  9. **
  10. **  Written 1996/1997 by Roland 'Gizzy' Mainz
  11. **
  12. */
  13.  
  14. /* project includes */
  15. #include "mpegvideo.h"
  16. #include "mpegproto.h"
  17.  
  18.  
  19. /*
  20.  *--------------------------------------------------------------
  21.  *
  22.  *  InitOrderedDither--
  23.  *
  24.  *    Structures intialized for ordered dithering.
  25.  *
  26.  * Results:
  27.  *    None.
  28.  *
  29.  * Side effects:
  30.  *    None.
  31.  *
  32.  *--------------------------------------------------------------
  33.  */
  34.  
  35.  
  36. void InitOrderedDither( struct MPEGVideoInstData *mvid )
  37. {
  38.   long   i,
  39.          j,
  40.          k,
  41.          err_range,
  42.          threshval;
  43.   ULONG *lmark,
  44.         *cmark;
  45.  
  46.   for( i = 0 ; i < DITH_SIZE ; i++ )
  47.   {
  48.     lmark = l_darrays[ i ] = (ULONG *)mymalloc( mvid, (256 * sizeof( ULONG )) );
  49.  
  50.     for( j = 0 ; j < lum_values[ 0 ] ; j++)
  51.     {
  52.       *lmark++ = 0;
  53.     }
  54.  
  55.     for( j = 0 ; j < (LUM_RANGE - 1) ; j++ )
  56.     {
  57.       err_range = lum_values[ j + 1 ] - lum_values[ j ];
  58.       threshval = ((i * err_range) / DITH_SIZE) + lum_values[ j ];
  59.  
  60.       for( k = lum_values[ j ] ; k < lum_values[ j + 1 ] ; k++ )
  61.       {
  62.         if( k > threshval )
  63.           *lmark++ = ((j + 1) * (CR_RANGE * CB_RANGE));
  64.         else
  65.           *lmark++ = (j * (CR_RANGE * CB_RANGE));
  66.       }
  67.     }
  68.  
  69.     for( j = lum_values[ LUM_RANGE - 1 ] ; j < 256 ; j++ )
  70.     {
  71.       *lmark++ = (LUM_RANGE - 1) * (CR_RANGE * CB_RANGE);
  72.     }
  73.   }
  74.  
  75.   for( i = 0 ; i < DITH_SIZE ; i++ )
  76.   {
  77.     cmark = cr_darrays[ i ] = (ULONG *)mymalloc( mvid, (256 * sizeof( ULONG )) );
  78.  
  79.     for( j = 0 ; j < cr_values[ 0 ] ; j++ )
  80.     {
  81.       *cmark++ = 0;
  82.     }
  83.  
  84.     for( j = 0 ; j < (CR_RANGE - 1) ; j++ )
  85.     {
  86.       err_range = cr_values[ j + 1 ] - cr_values[ j ];
  87.       threshval = ((i * err_range) / DITH_SIZE) + cr_values[ j ];
  88.  
  89.       for( k = cr_values[ j ] ; k < cr_values[ j + 1 ] ; k++ )
  90.       {
  91.         if( k > threshval )
  92.           *cmark++ = ((j + 1) * CB_RANGE);
  93.         else
  94.           *cmark++ = (j * CB_RANGE);
  95.       }
  96.     }
  97.  
  98.     for( j = cr_values[ CR_RANGE - 1 ] ; j < 256 ; j++ )
  99.     {
  100.       *cmark++ = (CR_RANGE - 1) * (CB_RANGE);
  101.     }
  102.   }
  103.  
  104.   for( i = 0 ; i < DITH_SIZE ; i++ )
  105.   {
  106.     cmark = cb_darrays[ i ] = (ULONG *)mymalloc( mvid, (256 * sizeof( ULONG )) );
  107.  
  108.     for( j = 0 ; j < cb_values[ 0 ] ; j++ )
  109.     {
  110.       *cmark++ = 0;
  111.     }
  112.  
  113.     for( j = 0 ; j < (CB_RANGE - 1) ; j++ )
  114.     {
  115.       err_range = cb_values[ j + 1 ] - cb_values[ j ];
  116.       threshval = ((i * err_range) / DITH_SIZE) + cb_values[ j ];
  117.  
  118.       for( k = cb_values[ j ] ; k < cb_values[ j + 1 ] ; k++ )
  119.       {
  120.         if( k > threshval )
  121.           *cmark++ = j+1;
  122.         else
  123.           *cmark++ = j;
  124.       }
  125.     }
  126.  
  127.     for( j = cb_values[ CB_RANGE - 1 ] ; j < 256 ; j++ )
  128.     {
  129.       *cmark++ = CB_RANGE - 1;
  130.     }
  131.   }
  132. }
  133.  
  134.  
  135. /*
  136.  *--------------------------------------------------------------
  137.  *
  138.  * OrderedDitherImage --
  139.  *
  140.  *  Dithers an image using an ordered dither.
  141.  *  Assumptions made:
  142.  *    1) The color space is allocated y:cr:cb = 8:4:4
  143.  *    2) The spatial resolution of y:cr:cb is 4:1:1
  144.  *      The channels are dithered based on the standard
  145.  *      ordered dither pattern for a 4x4 area.
  146.  *
  147.  * Results:
  148.  *   None.
  149.  *
  150.  * Side effects:
  151.  *   None.
  152.  *
  153.  *--------------------------------------------------------------
  154.  */
  155.  
  156.  
  157. void OrderedDitherImage( struct MPEGVideoInstData *mvid, UBYTE *lum, UBYTE *cr, UBYTE *cb, UBYTE *out, UWORD h, UWORD w )
  158. {
  159.     UBYTE *l, *r, *b, *o1, *o2;
  160.     UBYTE *l2;
  161.     UBYTE  L, R, B;
  162.     UWORD  i,
  163.            j;
  164.  
  165.     l     = lum;
  166.     l2    = lum + w;
  167.     r     = cr;
  168.     b     = cb;
  169.     o1    = out;
  170.     o2    = out + w;
  171.  
  172.     for( i = 0U ; i < h ; i += 4U )
  173.     {
  174.       for( j = 0U ; j < w ; j += 8U )
  175.       {
  176.         R = r[ 0 ]; B = b[ 0 ];
  177.  
  178.         L = l[  0 ]; o1[ 0 ] = mappixel[ (l_darrays[  0 ][ L ]   + cr_darrays[  0 ][ R ]  + cb_darrays[  0 ][ B ]) ];
  179.         L = l[  1 ]; o1[ 1 ] = mappixel[ (l_darrays[  8 ][ L ]   + cr_darrays[  8 ][ R ]  + cb_darrays[  8 ][ B ]) ];
  180.         L = l2[ 0 ]; o2[ 0 ] = mappixel[ (l_darrays[ 12 ][ L ]   + cr_darrays[ 12 ][ R ]  + cb_darrays[ 12 ][ B ]) ];
  181.         L = l2[ 1 ]; o2[ 1 ] = mappixel[ (l_darrays[  4 ][ L ]   + cr_darrays[  4 ][ R ]  + cb_darrays[  4 ][ B ]) ];
  182.  
  183.         R = r[ 1 ]; B = b[ 1 ];
  184.  
  185.         L = l[  2 ]; o1[ 2 ] = mappixel[ (l_darrays[  2 ][ L ]  + cr_darrays[  2 ][ R ] + cb_darrays[  2 ][ B ]) ];
  186.         L = l[  3 ]; o1[ 3 ] = mappixel[ (l_darrays[ 10 ][ L ]  + cr_darrays[ 10 ][ R ] + cb_darrays[ 10 ][ B ]) ];
  187.         L = l2[ 2 ]; o2[ 2 ] = mappixel[ (l_darrays[ 14 ][ L ]  + cr_darrays[ 14 ][ R ] + cb_darrays[ 14 ][ B ]) ];
  188.         L = l2[ 3 ]; o2[ 3 ] = mappixel[ (l_darrays[  6 ][ L ]  + cr_darrays[  6 ][ R ] + cb_darrays[  6 ][ B ]) ];
  189.  
  190.         R = r[ 2 ]; B = b[ 2 ];
  191.  
  192.         L = l[  4 ]; o1[ 4 ] = mappixel[ (l_darrays[  0 ][ L ]  + cr_darrays[  0 ][ R ] + cb_darrays[  0 ][ B ]) ];
  193.         L = l[  5 ]; o1[ 5 ] = mappixel[ (l_darrays[  8 ][ L ]  + cr_darrays[  8 ][ R ] + cb_darrays[  8 ][ B ]) ];
  194.         L = l2[ 4 ]; o2[ 4 ] = mappixel[ (l_darrays[ 12 ][ L ]  + cr_darrays[ 12 ][ R ] + cb_darrays[ 12 ][ B ]) ];
  195.         L = l2[ 5 ]; o2[ 5 ] = mappixel[ (l_darrays[  4 ][ L ]  + cr_darrays[  4 ][ R ] + cb_darrays[  4 ][ B ]) ];
  196.  
  197.         R = r[ 3 ]; B = b[ 3 ];
  198.  
  199.         L = l[  6 ]; o1[ 6 ] = mappixel[ (l_darrays[  2 ][ L ]  + cr_darrays[  2 ][ R ] + cb_darrays[  2 ][ B ]) ];
  200.         L = l[  7 ]; o1[ 7 ] = mappixel[ (l_darrays[ 10 ][ L ]  + cr_darrays[ 10 ][ R ] + cb_darrays[ 10 ][ B ]) ];
  201.         L = l2[ 6 ]; o2[ 6 ] = mappixel[ (l_darrays[ 14 ][ L ]  + cr_darrays[ 14 ][ R ] + cb_darrays[ 14 ][ B ]) ];
  202.         L = l2[ 7 ]; o2[ 7 ] = mappixel[ (l_darrays[  6 ][ L ]  + cr_darrays[  6 ][ R ] + cb_darrays[  6 ][ B ]) ];
  203.  
  204.         l  += 8;
  205.         l2 += 8;
  206.         r  += 4;
  207.         b  += 4;
  208.         o1 += 8;
  209.         o2 += 8;
  210.       }
  211.  
  212.       l  += w; l2 += w;
  213.       o1 += w; o2 += w;
  214.  
  215.       for( j = 0 ; j < w ; j += 8 )
  216.       {
  217.         R = r[ 0 ]; B = b[ 0 ];
  218.  
  219.         L = l[  0 ]; o1[ 0 ] = mappixel[ (l_darrays[  3 ][ L ]  + cr_darrays[  3 ][ R ] + cb_darrays[  3 ][ B ]) ];
  220.         L = l[  1 ]; o1[ 1 ] = mappixel[ (l_darrays[ 11 ][ L ]  + cr_darrays[ 11 ][ R ] + cb_darrays[ 11 ][ B ]) ];
  221.         L = l2[ 0 ]; o2[ 0 ] = mappixel[ (l_darrays[ 15 ][ L ]  + cr_darrays[ 15 ][ R ] + cb_darrays[ 15 ][ B ]) ];
  222.         L = l2[ 1 ]; o2[ 1 ] = mappixel[ (l_darrays[  7 ][ L ]  + cr_darrays[  7 ][ R ] + cb_darrays[  7 ][ B ]) ];
  223.  
  224.         R = r[ 1 ]; B = b[ 1 ];
  225.  
  226.         L = l[  2 ]; o1[ 2 ] = mappixel[ (l_darrays[  1 ][ L ]  + cr_darrays[  1 ][ R ] + cb_darrays[  1 ][ B ]) ];
  227.         L = l[  3 ]; o1[ 3 ] = mappixel[ (l_darrays[  9 ][ L ]  + cr_darrays[  9 ][ R ] + cb_darrays[  9 ][ B ]) ];
  228.         L = l2[ 2 ]; o2[ 2 ] = mappixel[ (l_darrays[ 13 ][ L ]  + cr_darrays[ 13 ][ R ] + cb_darrays[ 13 ][ B ]) ];
  229.         L = l2[ 3 ]; o2[ 3 ] = mappixel[ (l_darrays[  5 ][ L ]  + cr_darrays[  5 ][ R ] + cb_darrays[  5 ][ B ]) ];
  230.  
  231.         R = r[ 2 ]; B = b[ 2 ];
  232.  
  233.         L = l[  4 ]; o1[ 4 ] = mappixel[ (l_darrays[  3 ][ L ]  + cr_darrays[  3 ][ R ] + cb_darrays[  3 ][ B ]) ];
  234.         L = l[  5 ]; o1[ 5 ] = mappixel[ (l_darrays[ 11 ][ L ]  + cr_darrays[ 11 ][ R ] + cb_darrays[ 11 ][ B ]) ];
  235.         L = l2[ 4 ]; o2[ 4 ] = mappixel[ (l_darrays[ 15 ][ L ]  + cr_darrays[ 15 ][ R ] + cb_darrays[ 15 ][ B ]) ];
  236.         L = l2[ 5 ]; o2[ 5 ] = mappixel[ (l_darrays[  7 ][ L ]  + cr_darrays[  7 ][ R ] + cb_darrays[  7 ][ B ]) ];
  237.  
  238.         R = r[ 3 ]; B = b[ 3 ];
  239.  
  240.         L = l[  6 ]; o1[ 6 ] = mappixel[ (l_darrays[  1 ][ L ]  + cr_darrays[  1 ][ R ] + cb_darrays[  1 ][ B ]) ];
  241.         L = l[  7 ]; o1[ 7 ] = mappixel[ (l_darrays[  9 ][ L ]  + cr_darrays[  9 ][ R ] + cb_darrays[  9 ][ B ]) ];
  242.         L = l2[ 6 ]; o2[ 6 ] = mappixel[ (l_darrays[ 13 ][ L ]  + cr_darrays[ 13 ][ R ] + cb_darrays[ 13 ][ B ]) ];
  243.         L = l2[ 7 ]; o2[ 7 ] = mappixel[ (l_darrays[  5 ][ L ]  + cr_darrays[  5 ][ R ] + cb_darrays[  5 ][ B ]) ];
  244.  
  245.         l  += 8;
  246.         l2 += 8;
  247.         r  += 4;
  248.         b  += 4;
  249.         o1 += 8;
  250.         o2 += 8;
  251.       }
  252.  
  253.       l  += w; l2 += w;
  254.       o1 += w; o2 += w;
  255.     }
  256. }
  257.  
  258.  
  259.  
  260.